#ifndef _SSD1306_H
#define _SSD1306_H

#define OLED_OPEN_DISPLAY 0xaf                //开屏幕显示
#define OLED_CLOSE_DISPLAY 0xae               //关屏幕显示
#define OLED_SET_CONTRAST_RATIO 0x81          //设置对比度
#define OLED_SET_ADDR_SEEKING_MODE 0x20       //设置地址模式

#define OLED_ADDR_SEEKING_MODE_VERTICAL 0x1   //垂直地址模式
#define OLED_ADDR_SEEKING_MODE_HORIZONTAL 0x0 //水平地址模式
#define OLED_ADDR_SEEKING_MODE_PAGE 0x2       //页地址模式

#define OLED_SET_CLKDIV 0xd5                  //设置时钟分频因子，跟一字节参数。参数[3:0]为分频因子，[7:4]为震荡频率
#define OLED_SET_DEVCHANNELS 0xa8             //设置驱动路数
#define OLED_SET_DISPLAY_OFFSET 0xd3          //设置显示偏移
#define OLED_SET_DIS_START 0x40               //设置显示开始行。[5:0]为行数.

#define GRAM_SIZE 1024
struct SSD1306_frame_node
{
  unsigned char *context;
  struct SSD1306_frame_node *suc;
};

struct SSD1306_display
{
  int fd;
  unsigned char dev_addr;
  
  struct SSD1306_frame_node *frames_head;
};
/*
帧由一个链表实现，每个链表项目的有效数据是一个1024长度的8位数组，顺序储存了显存之内的数据。每个对象一
般对应一块屏幕，在这个对象内，可以存在的帧数量不设上限。要注意的是，帧只储存在主机上，是显示内容的一个
抽象数据，并不会将每一帧都传输到屏幕上。同理，自动播放也是在主机上实现的。
*/

int SSD1306_send_cmd (int hi2c, unsigned char cmd);
int SSD1306_send_data (int hi2c, unsigned char *data, unsigned int data_size);

int SSD1306_Init (struct SSD1306_display *obj, char *dev_path);
int SSD1306_UpdateDisplay (struct SSD1306_display *obj, int frame);

int SSD1306_CreateFrame (struct SSD1306_display *obj, int frame);
int SSD1306_CleanFrame (struct SSD1306_display *obj, int frame);
int SSD1306_WritePoint (struct SSD1306_display *obj, int frame, int x, int y);
int SSD1306_DrawFZ (struct SSD1306_display *obj, int frame, int xb, int yb, unsigned char *fz);

int SSD1306_DrawJX (struct SSD1306_display *obj, int frame, int x1, int y1, int x2, int y2);
int SSD1306_DrawZX (struct SSD1306_display *obj, int frame, int x1, int y1, int x2, int y2);
int SSD1306_DrawYX (struct SSD1306_display *obj, int frame, int x, int y, int r);

#endif
